package io.github.talelin.latticy.common.util;

import com.github.dozermapper.core.DozerBeanMapperBuilder;
import com.github.dozermapper.core.Mapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 属性拷贝工具类
 *
 * @author YiHua
 * @date 2021/9/6 7:36 下午
 */
@Slf4j
public class BeanCopyUtil {

       /*
              <!-- 属性拷贝的类库 -->
               <dependency>
                   <groupId>com.github.dozermapper</groupId>
                   <artifactId>dozer-core</artifactId>
                   <version>6.5.0</version>
               </dependency>
        */

       /**
        * 简单拷贝
        *
        * @param source true 源对象
        * @param target true 目标对象
        */
       public static void copy(Object source, Object target) {
              BeanUtils.copyProperties(source, target);
       }

       /**
        * 使用Dozer，支持深拷贝
        *
        * @param source 源对象
        * @param tClass 目标对象的类
        * @param <T>
        * @return
        */
       public static <T> T copy(Object source, Class<T> tClass) {
              Mapper mapper = DozerBeanMapperBuilder.buildDefault();
              return mapper.map(source, tClass);
       }

       /**
        * 使用Dozer，支持深拷贝，支持拷贝list
        *
        * @param list
        * @param tClass
        * @param <T>
        */
       public static <T> List<T> copyList(List list, Class<T> tClass) {
              // 使用dozer
              Mapper mapper = DozerBeanMapperBuilder.buildDefault();

              // 目标类型承接list，用于数据转换
              List<T> targetList = new ArrayList<>();

              // 进行属性拷贝
              list.forEach(item -> {
                     T t = mapper.map(item, tClass);
                     targetList.add(t);
              });

              // 返回目标的list集合
              return targetList;
       }
}
